﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using OwnZTec.LojaDelivery.Data;
using Telerik.WinControls.UI;

namespace OwnZTec.LojaDelivery.UI.WinForms
{
    public partial class FrmEntregaSaida : OwnZForm
    {

        #region -- Membros e Construtores -------------------------------------------------------------------------------------------------

        public FrmEntregaSaida()
        {
            InitializeComponent();
            this.ConfigurarFormFilho();
        }

        private tbVenda Venda{ get; set; }
        private tbEntrega Entrega { get; set; }

        #endregion

        private void cmdAtualizar_Click(object sender, EventArgs e)
        {
            AtualizarGrid();
        }

        #region -- Eventos ----------------------------------------------------------------------------------------------------------------
        
        private void FrmEntregaSaida_Load(object sender, EventArgs e)
        {
            CarregaFuncionarios();

            //TODO: Inserir este código nas combos para procurar
            cboFuncionarios.DropDownListElement.AutoCompleteSuggest.SuggestMode = SuggestMode.Contains;

            AtualizarGrid();

            Contexto.MainForm.Cursor = Cursors.Arrow;
        }
        
        private void cmdSair_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void btnImprimir_Click(object sender, EventArgs e)
        {
            //Verifica se tem selecionado
            List<listaPedidosEntrega> lista = ((List<listaPedidosEntrega>)gvPedidos.DataSource).Where(p => p.imprime == true).ToList();
            if (lista.Count == 0)
            {
                MessageBox.Show("Não existem comandas selecionadas", "Entrega", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            StringBuilder sb = new StringBuilder();

            

            foreach (listaPedidosEntrega item in lista)
            {
                sb = MontaImpressao(sb, item);
                sb.AppendLine("");
                sb.AppendLine("================ cortar ================");
                sb.AppendLine("");
            }

            sb.AppendLine("================== FIM ==================");
            //Inserindo espaços para cortar
            for (int i = 0; i <= 7; i++)
            {
                sb.AppendLine("");
            }

            //TODO: Apagar as linhas abaixo e habilitar a impressão
            //**** Parte para apagar
            var frm = new FrmMostraTela
            {
                Pai = this,
                sbImprime = sb
            };
            frm.ShowDialog();

            //**** Final para apagar


            ////Atualiza Status do Pedido e insere na tabela Entregas
            AtualizaTabelas(lista);

            //Impressao.Impressao imprime = new Impressao.Impressao();
            //imprime.ImprimeDesperdicio(sb);

            AtualizarGrid();

        }

        private void btnMostrar_Click(object sender, EventArgs e)
        {
            StringBuilder sb = new StringBuilder();

            List<listaPedidosEntrega> lista = (List<listaPedidosEntrega>)gvPedidos.DataSource;

            foreach (listaPedidosEntrega item in lista.Where(p => p.imprime == true).ToList())
            {
                sb = MontaImpressao(sb, item);
                sb.AppendLine("=========================================");
            }

            sb.AppendLine("================== FIM ==================");
            //Inserindo espaços para cortar
            for (int i = 0; i <= 7; i++)
            {
                sb.AppendLine("");
            }

            var frm = new FrmMostraTela
            {
                Pai = this,
                sbImprime = sb
            };
            frm.ShowDialog();
        }

        #endregion

        #region -- Metodos ----------------------------------------------------------------------------------------------------------------

        List<listaPedidosEntrega> listaEntrega;
        public void AtualizarGrid()
        {
            Cursor = Cursors.WaitCursor;

            listaEntrega = new List<listaPedidosEntrega>();
            listaPedidosEntrega listaItem = new listaPedidosEntrega();
            foreach (var item in Contexto.Db.tbVendas.Where(p => p.statusVenda == "A").ToList())
            {
                listaItem = new listaPedidosEntrega();
                listaItem.data = item.dtVenda.ToString("dd/MM/yyyy");
                listaItem.idPedido = item.idVenda;
                listaItem.numPedido = Contexto.Db.tbVendas.First(p => p.idVenda == item.idVenda).numeroVenda.ToString();
                listaItem.idCliente = item.idCliente;
                listaItem.cliente = Contexto.Db.tbClientes.First(p => p.idCliente == item.idCliente).desCliente;
                listaItem.valorTotal = item.valorVenda;
                listaItem.qtdeCaixa = 0;
                listaEntrega.Add(listaItem);
            }

            gvPedidos.DataSource = listaEntrega;

            Cursor = Cursors.Arrow;
        }

        private void CarregaFuncionarios()
        {
            cboFuncionarios.DataSource = Contexto.Db.tbFuncionarios.Where(p => p.flgEntrega == true);
            cboFuncionarios.ValueMember = "idFuncionario";
            cboFuncionarios.DisplayMember = "desNomeFuncionario";
        }

        private StringBuilder MontaImpressao(StringBuilder sb, listaPedidosEntrega item)
        {
            //Cabeçalho
            sb.AppendLine("CELIA SALGADOS - (19)3254-1222-3252-6926");
            sb.AppendLine("Emitido em " + DateTime.Now.ToString());
            sb.AppendLine("5Power Sistemas");
            sb.AppendLine("PEDIDO DE COMPRA - ( SEM VALOR FISCAL )");
            sb.AppendLine("=========================================");
            int idCliente = item.idCliente;
            sb.AppendLine("Cliente : " + Contexto.Db.tbClientes.First(p => p.idCliente == idCliente).desCliente);
            sb.AppendLine("Endereco: " + Contexto.Db.tbClientes.First(p => p.idCliente == idCliente).Endereco);
            sb.Append(", " + Contexto.Db.tbClientes.First(p => p.idCliente == idCliente).Numero);
            sb.AppendLine("=========================================");
            sb.AppendLine("PEDIDO: " + item.numPedido);
            sb.AppendLine("Data da Venda: " + item.data);
            sb.AppendLine("=========================================");

            sb.AppendLine("Cod    Descricao do Salgado");
            sb.AppendLine("          Qtde     Unit R$       Total R$");
            sb.AppendLine("=========================================");

            //Looping para os detalhes
            decimal valorTotal = 0;
            foreach (var det in Contexto.Db.tbVendaDetalhes.Where(p=>p.idVenda==item.idPedido).ToList())
            {
                string zeros = string.Empty;
                //Código Produto e Descrição
                //sb.AppendLine("0004    ESFIHA DE CARNE");
                if (det.idProduto.ToString().Length < 4)
                {
                    for (int i = 0; i <= (4 - det.idProduto.ToString().Length); i++)
                    {
                        zeros += "0";
                    }
                    sb.AppendLine(zeros + det.idProduto + "    " + Contexto.Db.tbProdutoes.First(p => p.idProduto == det.idProduto).desNomeProduto.ToUpper());
                }
                else
                    sb.AppendLine(det.idProduto + "    " + Contexto.Db.tbProdutoes.First(p=>p.idProduto==det.idProduto).desNomeProduto.ToUpper());

                zeros = string.Empty;
                //Qtde, Valor Unitário e Valor Total
                //sb.AppendLine("           3 x      1,25       =    3,75");
                sb.Append(("           ").Substring(det.qtde.ToString().Length - 1));
                sb.Append(det.qtde.ToString());
                sb.Append(" x");
                sb.Append(("      ").Substring(det.valorItem.ToString().Length - 4));
                sb.Append(det.valorItem.ToString());
                sb.Append("       =");
                sb.Append(("    ").Substring(det.valorTotal.ToString().Length - 4));
                sb.Append(det.valorTotal.ToString());
                sb.AppendLine("");

                valorTotal += det.valorTotal;
            }

            //Final do Pedido
            sb.AppendLine("=========================================");
            sb.AppendLine("Qtde Total: " + Contexto.Db.tbVendas.First(p => p.idVenda == item.idPedido).qtdeTotal.ToString() + "                 =  " + valorTotal.ToString("C"));
            sb.AppendLine("Desconto da Nota : " + Contexto.Db.tbVendas.First(p=>p.idVenda==item.idPedido).valorDesconto.ToString());
            sb.AppendLine("Acrescimo da Nota: " + Contexto.Db.tbVendas.First(p => p.idVenda == item.idPedido).valorFrete.ToString());
            sb.AppendLine("");
            sb.AppendLine("****** Total da Comanda: " + Contexto.Db.tbVendas.First(p => p.idVenda == item.idPedido).valorVenda.ToString("C") + " ******");
            sb.AppendLine("");
            sb.AppendLine("=========================================");

            //Rodapé da nota
            sb.AppendLine("");
            sb.AppendLine("Validade:");
            sb.AppendLine("- Consumo IMEDIATO (quando aquecido)");
            sb.AppendLine("- 2 (dois) dias se mantido sob");
            sb.AppendLine("  refrigeracao imediatamente apos");
            sb.AppendLine("  o recebimento");
            sb.AppendLine("- 60 (sessenta) dias se congelado");
            sb.AppendLine("  IMEDIATAMENTE apos o recebimento");

            return sb;
        }

        private void AtualizaTabelas(List<listaPedidosEntrega> lista)
        {
            foreach (listaPedidosEntrega item in lista)
            {
                //salvando na tabela vendas
                Venda = Contexto.Db.tbVendas.First(p => p.idVenda == item.idPedido);
                Venda.statusVenda = "E";
                Venda.idMotorista = cboFuncionarios.SelectedValue.ParaInt();

                Contexto.Db.SaveChanges();

                //salvando na tabela Entregas
                Entrega = new tbEntrega();
                Entrega.idVenda = item.idPedido;
                Entrega.idMotorista = cboFuncionarios.SelectedValue.ParaInt();
                Entrega.qtdeCaixa = item.qtdeCaixa;
                Entrega.dtSaida = DateTime.Now;
                Entrega.flgAtivo = true;
                Contexto.Db.tbEntregas.AddObject(Entrega);
                Contexto.Db.SaveChanges();
            }
        }

        #endregion

        private void gvPedidos_CommandCellClick(object sender, EventArgs e)
        {
            int Pedido = Convert.ToInt32(gvPedidos.SelectedRows[0].Cells["idPedido"].Value.ToString());

            Venda = Contexto.Db.tbVendas.First(p => p.idVenda == Pedido);
            Venda.statusVenda = "C";

            Contexto.Db.SaveChanges();

            AtualizarGrid();
        }
    }
    public class listaPedidosEntrega
    {
        public bool imprime { get; set; }
        public string data { get; set; }
        public int idPedido { get; set; }
        public string numPedido { get; set; }
        public int idCliente { get; set; }
        public string cliente { get; set; }
        public decimal valorTotal { get; set; }
        public int qtdeCaixa { get; set; }
    }
}
